package com.snail.billing;

import java.math.BigDecimal;
import java.util.regex.Pattern;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;

import com.android.os.MyEngine;
import com.android.util.AlertUtil;
import com.snail.billing.data.Account;
import com.snail.billing.data.AccountManager;
import com.snail.billing.data.UUIDManager;
import com.snail.billing.page.LoginPage;
import com.snail.billing.page.PaymentStatePage;
import com.snail.billing.page.UserCenterPage;

public class BillingService {

	public static final String version = "20150414";

	/**
	 * 是否使用沙盒测试环境
	 * 
	 * @param isUseful
	 *            -- 是否使用沙盒测试环境
	 */
	public static void setSandBox(boolean isUseful) {
		DataCache.getInstance().isSandbox = isUseful;
	}

	public static void setCallbackIsMd5(boolean isMd5) {
		DataCache.getInstance().callbackIsMd5 = isMd5;
	}

	private static void initContext(Context context) {
		MyEngine.getEngine().setApplicationContext(context.getApplicationContext());
		MyEngine.getEngine().setActivity((Activity) context);
		UUIDManager.initUUID();
		AccountManager.initAccountManager();
	}

	private static void setHostParams(ImportParams importParams) {
		if (DataCache.getInstance().isSandbox) {
			// 沙盒sandbox
			importParams.hostPlatform = "www3.sandbox.wn";
			importParams.hostImprest = "payment.api.sandbox.wn";
			importParams.hostCard = "payment.api.sandbox.wn";
			importParams.hostBusiness = "business.api.sandbox.wn";
			importParams.hostSecurity = "security.woniu.com";
			importParams.isAccess = true;
		} else {
			// 正式
			importParams.hostPlatform = "www3.woniu.com";
			importParams.hostImprest = "imprest.api.woniu.com";
			importParams.hostCard = "card.api.woniu.com";
			importParams.hostBusiness = "passport.api.woniu.com";
			importParams.hostSecurity = "security.woniu.com";
			importParams.isAccess = true;
		}
	}

	/**
	 * 登录主界面
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param gameId
	 *            -- 游戏Id
	 * @param extra
	 *            -- 扩展参数 -- Bundle extra = new Bundle(); -- extra.putString("channelId", value);
	 * @param billingCallback
	 *            -- 计费回调接口
	 */
	public static void launch(Context context, String gameId, Bundle extra, BillingCallback billingCallback) {
		// 参数判断
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (billingCallback == null) {
			billingCallback = new BillingCallback();
		}
		// 初始化
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.extra = extra;
		importParams.billingCallback = billingCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		// 逻辑
		BillingLogic logic = new BillingLogic(context);
		logic.launch();
	}

	/**
	 * 登录成功后调用 （必须在游戏登录后调用此方法）
	 * 
	 * @param context
	 *            -- 设备上下文
	 */
	public static void launchSuccess(Context context) {
		initContext(context);
		if (DataCache.getInstance().dialogAccount != null) {
			Account currentAccount = DataCache.getInstance().dialogAccount;
			AccountManager.setAccount(currentAccount);
			DataCache.getInstance().dialogAccount = null;
		}
	}

	/**
	 * 登录失败后调用 （必须在游戏登录后调用此方法）
	 * 
	 * @param context
	 *            -- 设备上下文
	 */
	public static void launchFail(Context context) {
		initContext(context);
		if (DataCache.getInstance().dialogAccount != null) {
			DataCache.getInstance().dialogAccount = null;
		}
		AccountManager.clearCurrentAccount();
	}

	/*
	 * 登录切换账号
	 * 
	 * @param context -- 设备上下文
	 * 
	 * @param gameId -- 游戏Id
	 * 
	 * @param extra -- 扩展参数 -- Bundle extra = new Bundle(); -- extra.putString("channelId", value);
	 * 
	 * @param billingCallback -- 计费回调接口
	 */
	public static void launchChange(Context context, String gameId, Bundle extra, BillingCallback billingCallback) {
		// 参数判断
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (billingCallback == null) {
			billingCallback = new BillingCallback();
		}
		// 初始化
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.extra = extra;
		importParams.billingCallback = billingCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		// 逻辑
		DataCache.getInstance().importParams.pageClass = LoginPage.class;
		context.startActivity(new Intent(context, Billing.class));
	}

	/**
	 * 导入老账号
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param account
	 *            -- 账号（蜗牛通行证）
	 * @param pwd
	 *            -- 密码
	 * @param type
	 *            -- 账号类型
	 */
	public static void importOldAccount(Context context, String account, String pwd, String type) {
		initContext(context);
		if (AccountManager.getCurrentAccount() == null) {
			Account currentAccount = new Account();
			currentAccount.setAccount(account);
			currentAccount.setPwd(pwd);
			if (!TextUtils.isEmpty(type)) {
				currentAccount.setType(type);
			} else if (Pattern.compile("^[Ww][Nn][\\d]+$").matcher(account).matches()) {
				currentAccount.setType(Account.TYPE_RANDOM_OLD);
			} else {
				currentAccount.setType(Account.TYPE_COMMON);
			}
			AccountManager.setAccount(currentAccount);
		}
	}

	/**
	 * 进入用户中心按钮
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param account
	 *            -- 账号
	 * @param gameId
	 *            -- 游戏Id
	 * @param serverId
	 *            -- 服务器Id
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param billingCallback
	 *            -- 计费回调接口
	 */
	public static void userCenterButton(Context context, String account, String gameId, String serverId, Bundle extra, BillingCallback billingCallback) {
		// 参数判断
		if (TextUtils.isEmpty(account)) {
			AlertUtil.show(context, "account param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(serverId)) {
			AlertUtil.show(context, "serverId param is null");
			return;
		}
		if (billingCallback == null) {
			billingCallback = new BillingCallback();
		}
		// 初始化
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.account = account;
		importParams.gameId = gameId;
		importParams.serverId = serverId;
		importParams.extra = extra;
		importParams.billingCallback = billingCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		// 逻辑
		DataCache.getInstance().importParams.pageClass = UserCenterPage.class;
		context.startActivity(new Intent(context, Billing.class));
	}

	/**
	 * 显示用户中心浮动图标
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param account
	 *            -- 账号
	 * @param gameId
	 *            -- 游戏Id
	 * @param serverId
	 *            -- 服务器Id
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param billingCallback
	 *            -- 计费回调接口
	 */
	public static void userCenterFloatViewShow(Context context, String account, String gameId, String serverId, Bundle extra, BillingCallback billingCallback) {
		// 参数判断
		if (TextUtils.isEmpty(account)) {
			AlertUtil.show(context, "account param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(serverId)) {
			AlertUtil.show(context, "serverId param is null");
			return;
		}
		if (billingCallback == null) {
			billingCallback = new BillingCallback();
		}
		// 初始化
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.account = account;
		importParams.gameId = gameId;
		importParams.serverId = serverId;
		importParams.extra = extra;
		importParams.billingCallback = billingCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		// 逻辑
		BillingLogic logic = new BillingLogic(context);
		logic.showUserCenterFloatView();
	}

	/**
	 * 关闭用户中心浮动图标
	 * 
	 * @param context
	 *            -- 设备上下文
	 */
	public static void userCenterFloatViewDismiss(Context context) {
		BillingLogic logic = new BillingLogic(context);
		logic.dismissUserCenterFloatView();
	}

	/**
	 * 创建订单
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param partnerId
	 *            -- 运营商Id（蜗牛官方为"007"，第三方平台都是三位数字,不足3位，前面补0）
	 * @param gameId
	 *            -- 游戏Id
	 * @param serverId
	 *            -- 服务器Id
	 * @param accountId
	 *            -- 账号数字Id
	 * @param extra
	 *            -- 扩展参数（暂不使用），可传null
	 * @param billingCallback
	 *            -- 计费回调接口
	 */
	public static void createOrderNo(Context context, String partnerId, String gameId, String serverId, String accountId, Bundle extra, BillingCallback billingCallback) {
		// 参数判断
		if (TextUtils.isEmpty(partnerId)) {
			AlertUtil.show(context, "partnerId param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(serverId)) {
			AlertUtil.show(context, "serverId param is null");
			return;
		}
		if (TextUtils.isEmpty(accountId)) {
			AlertUtil.show(context, "accountId param is null");
			return;
		}
		while (partnerId.length() < 3) {
			partnerId = "0" + partnerId;
		}
		// 初始化
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.gameId = gameId;
		importParams.serverId = serverId;
		importParams.partnerId = partnerId;
		importParams.aid = accountId;
		importParams.extra = extra;
		// 初始化2
		if (billingCallback == null) {
			billingCallback = new BillingCallback();
		}
		importParams.billingCallback = billingCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		// 逻辑
		BillingLogic logic = new BillingLogic(context);
		logic.createOrderNo();
	}

	/**
	 * 游戏支付
	 * 
	 * @param context
	 *            -- 设备上下文
	 * @param orderNo
	 *            -- 游戏订单号,(根据以下接口回调获取{@link BillingService#createOrderNo(Context, String, String, String, String, String, BillingCallback)})
	 * @param account
	 *            -- 账号（蜗牛通行证账号）
	 * @param gameId
	 *            -- 游戏ID
	 * @param productName
	 *            -- 商品名称
	 * @param price
	 *            -- 价格（单位：元）
	 * @param backUrl
	 *            -- 异步通知地址
	 * @param fontUrl
	 *            -- 前台页面跳转
	 * @param extra
	 *            -- 扩展参数 -- Bundle extra = new Bundle(); -- extra.putString("ext", value);
	 * @param billingCallback
	 *            -- 计费回调接口
	 */
	public static void paymentForGame(Context context, String orderNo, String account, String gameId, String productName, String price, String backUrl, String fontUrl, Bundle extra,
			BillingCallback billingCallback) {
		// 参数判断
		if (TextUtils.isEmpty(orderNo)) {
			AlertUtil.show(context, "orderNo param is null");
			return;
		}
		if (TextUtils.isEmpty(account)) {
			AlertUtil.show(context, "account param is null");
			return;
		}
		if (TextUtils.isEmpty(gameId)) {
			AlertUtil.show(context, "gameId param is null");
			return;
		}
		if (TextUtils.isEmpty(productName)) {
			AlertUtil.show(context, "productName param is null");
			return;
		}
		if (TextUtils.isEmpty(price)) {
			AlertUtil.show(context, "price param is null");
			return;
		}
		try {
			new BigDecimal(price);
		} catch (Exception e) {
			AlertUtil.show(context, "price param is error");
			return;
		}
		if (new BigDecimal(price).equals(new BigDecimal(0))) {
			AlertUtil.show(context, "price param is error");
			return;
		}
		// 初始化
		initContext(context);
		ImportParams importParams = new ImportParams();
		importParams.account = account;
		importParams.gameId = gameId;
		importParams.orderNo = orderNo;
		importParams.productName = productName;
		importParams.price = price;
		importParams.backUrl = backUrl;
		importParams.fontUrl = fontUrl;
		importParams.extra = extra;
		// 初始化2
		if (billingCallback == null) {
			billingCallback = new BillingCallback();
		}
		importParams.billingCallback = billingCallback;
		setHostParams(importParams);
		DataCache.newInstance().importParams = importParams;
		// 逻辑
		DataCache.getInstance().importParams.pageClass = PaymentStatePage.class;
		context.startActivity(new Intent(context, Billing.class));
	}

}
